/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.xadrez.ia;

import com.xadrez.modelo.Bispo;
import com.xadrez.modelo.Cavalo;
import com.xadrez.modelo.Peao;
import com.xadrez.modelo.Peca;
import com.xadrez.modelo.Posicao;
import com.xadrez.modelo.Rainha;
import com.xadrez.modelo.Rei;
import com.xadrez.modelo.Torre;

/**
 *
 * @author fabricio
 */
public class MiniMax extends IA {

//    private Arvore<TabuleiroIA> arvore;
    TabuleiroIA tabuleiro = null;

    public void inicialize(TabuleiroIA tabuleiro) {
        this.tabuleiro = (TabuleiroIA) tabuleiro.clone();
        //        arvore = new Arvore<TabuleiroIA>(tabuleiro);
    }

    
    public MiniMax() {
    }
// 

    private Jogada executeMiniMax(TabuleiroIA tabuleiro, int profundidade) {
        Jogada a = new Jogada();
        if ((profundidade == 0) || (tabuleiro.hasJogadas())) {
            return tabuleiro.getJogada();

        } else if (tabuleiro.getJogadorDaVez().getId() != getId()) {
            a.setPeso(10000); // 10000 equivale a infinito na nossa escala   
            for (Peca peca : tabuleiro.getPecasJogador(2)) {
                for (Posicao posicao : peca.recuperaMovimentosPossiveis()) {
                    Jogada jogada = new Jogada(posicao.getX(), posicao.getY());    
                    a = min(a, executeMiniMax(tabuleiro, profundidade - 1));
                }

            }
            return a;
        } else {
            a.setPeso(-10000);
            for (Peca peca : tabuleiro.getPecasJogador(1)) {
                for (Posicao posicao: peca.recuperaMovimentosPossiveis()) {
                    Jogada jogada = new Jogada(posicao.getX(), posicao.getY());    
                    a = max(a, executeMiniMax(tabuleiro, profundidade - 1));
                }

            }
            return a;
        }
    }

    // conveção se positivo jogador ganhado, 0 empate, negativo perdendo
    private int estatus(int jogador, TabuleiroIA tabuleiro) {
        int pontos = 0;
        for (Peca peca : tabuleiro.getPecas(1)) {
            if (peca instanceof Bispo) {
                pontos = pontos + 5;
            } else if (peca instanceof Cavalo) {
                pontos = pontos + 4;
            } else if (peca instanceof Peao) {
                pontos = pontos + 1;
            } else if (peca instanceof Rainha) {
                pontos = pontos + 9;
            } else if (peca instanceof Rei) {
                pontos = pontos + 0;
            } else if (peca instanceof Torre) {
                pontos = pontos + 5;
            }

        }

        for (Peca peca : tabuleiro.getPecas(2)) {
            if (peca instanceof Bispo) {
                pontos = pontos - 4;
            } else if (peca instanceof Cavalo) {
                pontos = pontos - 2;
            } else if (peca instanceof Peao) {
                pontos = pontos - 1;
            } else if (peca instanceof Rainha) {
                pontos = pontos - 9;
            } else if (peca instanceof Rei) {
                pontos = pontos - 5;
            } else if (peca instanceof Torre) {
                pontos = pontos - 4;
            }
        }
        if (jogador == 2) {
            pontos = -pontos;
        }
        return pontos;
    }

    Jogada min(Jogada jogA, Jogada jogB) {
        if (jogA.compareTo(jogB) <= 1) {
            return jogA;
        } else {
            return jogB;
        }
    }

    Jogada max(Jogada jogA, Jogada jogB) {
        if (jogA.compareTo(jogB) >= 1) {
            return jogA;
        } else {
            return jogB;
        }
    }

    @Override
    public boolean jogar(Peca peca) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
